home *** CD-ROM | disk | FTP | other *** search
/ MacFormat España 26 / macformat_26.iso / Shareware / Programación / CDEF Set #1 / Extras / Demo App Project Files / CDEF Demo App.c < prev    next >
Text File  |  1996-11-30  |  16KB  |  633 lines

  1. #ifndef __CDEFDEMOAPP__
  2. #include "CDEF Demo App.h"        // include all constant values from external file
  3. #endif
  4.  
  5. #ifndef __GLOBALS__
  6. #include "Globals.h"
  7. #endif
  8.  
  9. #ifndef     __FXNPROTOS__
  10. #include "FxnProtos.h"
  11. #endif
  12.  
  13.  
  14. Boolean gDone = false;
  15.  
  16. /************************************************************************/
  17. /*    main                                                                */
  18. /*                                                                        */
  19. /*  Author: Jason Giles                                                    */
  20. /*    Created: September 16, 1995                                            */
  21. /*     Modified: February 2, 1996                                            */
  22. /************************************************************************/    
  23. void main ( void )
  24. {
  25.                             
  26.     ToolBoxInit ();
  27.             
  28.     MenuBarInit ();
  29.     
  30.     EventInit ();
  31.  
  32.     EventLoop ();
  33.         
  34. }
  35.  
  36. #pragma mark -
  37.  
  38. /************************************************************************/
  39. /*    ToolBoxInit                                                         */
  40. /*                                                                        */
  41. /*  Purpose:  Initializes all toolbox managers, in the most appropriate */
  42. /*                order according to various sources.                        */
  43. /*  Author: Jason Giles                                                    */
  44. /*    Created: September 16, 1995                                            */
  45. /*     Modified: October 15, 1995                                            */
  46. /************************************************************************/
  47. void ToolBoxInit ()
  48. {
  49.  
  50.     InitGraf (&qd.thePort);
  51.     InitFonts ();
  52.     InitWindows ();
  53.     InitMenus ();
  54.     TEInit ();
  55.     InitDialogs ( nil );
  56.     InitCursor ();
  57. }
  58.  
  59.  
  60. /************************************************************************/
  61. /*    EventInit                                                             */
  62. /*                                                                        */
  63. /*  Purpose:  Initializes the Event Handler                                */
  64. /*    Comment:  The err statements would not compile, so they were pre-    */
  65. /*                processed out.                                            */
  66. /*  Author: Jason Giles                                                    */
  67. /*    Created: September 16, 1995                                            */
  68. /*     Modified: August 7, 1996                                            */
  69. /************************************************************************/
  70. void EventInit ( void )
  71. {
  72.     OSErr                    err;
  73.     AEEventHandlerUPP        AEOpenApplicationUPP, AEOpenDocumentsUPP,
  74.                             AEPrintDocumentsUPP, AEQuitApplicationUPP;
  75.     long feature;
  76.     
  77.     err = Gestalt ( gestaltAppleEventsAttr, &feature );
  78.     
  79.     if ( err != noErr )
  80.     {
  81.         DebugStr ( "\pProblem in calling Gestalt!" );
  82.         return;
  83.     }
  84.     
  85.     else
  86.     {
  87.         if ( !( feature & ( kGestaltMask << gestaltAppleEventsPresent ) ) )
  88.         {
  89.             DebugStr ( "\pApple events not available" );
  90.             return;
  91.         }
  92.     }
  93.  
  94.     // Install the OpenApp AppleEvent Handler.
  95.     AEOpenApplicationUPP = NewAEEventHandlerProc( AEOpenApplication );    
  96.     err = AEInstallEventHandler( kCoreEventClass, kAEOpenApplication, 
  97.                                    AEOpenApplicationUPP, 0, false );
  98.     if ( err != noErr ) DebugStr ("\pkAEOpenApplication Apple event not available!" );
  99.  
  100.     // Install the OpenDoc AppleEvent Handler.
  101.     AEOpenDocumentsUPP = NewAEEventHandlerProc( AEOpenDocuments );
  102.     err = AEInstallEventHandler( kCoreEventClass, kAEOpenDocuments, 
  103.                                    AEOpenDocumentsUPP, 0, false );
  104.     if ( err != noErr ) DebugStr ("\pkAEOpenDocuments Apple event not available!" );
  105.  
  106.     // Install the PrintDoc AppleEvent Handler
  107.     AEPrintDocumentsUPP = NewAEEventHandlerProc( AEPrintDocuments );
  108.     err = AEInstallEventHandler( kCoreEventClass, kAEPrintDocuments, 
  109.                                    AEPrintDocumentsUPP, 0, false );    
  110.     if ( err != noErr ) DebugStr ("\pkAEPrintDocuments Apple event not available!" );
  111.     
  112.     // Install the QuitApp AppleEvent Handler.
  113.     AEQuitApplicationUPP = NewAEEventHandlerProc( AEQuitApplication );
  114.     err = AEInstallEventHandler( kCoreEventClass, kAEQuitApplication, 
  115.                                    AEQuitApplicationUPP, 0, false );
  116.     if ( err != noErr ) DebugStr ("\pkAEQuitApplication Apple event not available!" );
  117.  
  118.     
  119. }
  120.  
  121.  
  122.  
  123. /************************************************************************/
  124. /*    MenuBarInit                                                             */
  125. /*                                                                        */
  126. /*  Purpose:  Initializes the Menu Bar                                    */
  127. /*    Comment:                                                              */
  128. /*  Author: Jason Giles                                                    */
  129. /*    Created: September 16, 1995                                            */
  130. /*     Modified: January 15, 1995                                            */
  131. /************************************************************************/
  132. void MenuBarInit ( void )
  133. {
  134.     Handle            menuBar;                // handle for the menubar
  135.     MenuHandle         menu;                    
  136.  
  137.  
  138.     menuBar = GetNewMBar ( kBaseResID );    // assign a new menu bar to the menuBar handle
  139.     SetMenuBar ( menuBar );                    // pick the menubar to create
  140.     
  141.     menu = GetMHandle ( 128 );             // get apple menu
  142.     AddResMenu ( menu, 'DRVR' );
  143.     
  144.     menu = GetMHandle ( 129 );            // get file menu
  145.     
  146.     DrawMenuBar ();                            // show the menubar
  147. }
  148.  
  149. #pragma mark -
  150.  
  151.  
  152. /************************************************************************/
  153. /*    EventLoop                                                             */
  154. /*                                                                        */
  155. /*  Author: Jason Giles                                                    */
  156. /*    Created: September 16, 1995                                            */
  157. /*     Modified: January 15, 1995                                            */
  158. /************************************************************************/
  159. void EventLoop ( void )
  160. {
  161.     EventRecord event;
  162.     
  163.     gDone = false;
  164.     while ( gDone == false )
  165.     {
  166.         
  167.         WaitNextEvent ( everyEvent, &event, kSleep, nil );    // get next event in the que
  168.         
  169.         DoDialogEvent ( &event );        // DoDialogEvent function, then
  170.         
  171.     }
  172. }
  173.  
  174.  
  175. /************************************************************************/
  176. /*    DoDialogEvent                                                         */
  177.  
  178. /*  Author: Jason Giles                                                    */
  179. /*    Created: September 16, 1995                                            */
  180. /*     Modified: January 15, 1995                                            */
  181. /************************************************************************/
  182. void DoDialogEvent ( EventRecord *eventPtr )
  183. {
  184.     char             theChar;
  185.     short            itemHit = 0;    
  186.     
  187.     switch ( eventPtr->what )
  188.     {
  189.         case kHighLevelEvent:
  190.             AEProcessAppleEvent ( eventPtr );
  191.             break;
  192.         case mouseDown:
  193.             HandleMouseDown ( eventPtr, itemHit );
  194.             break;
  195.         case mouseUp:
  196.             break;
  197.         case keyUp:
  198.             break;
  199.         case keyDown:
  200.         case autoKey:
  201.             theChar = eventPtr->message & charCodeMask;
  202.             if ( (eventPtr->modifiers & cmdKey) != 0)
  203.                 HandleMenuChoice ( MenuKey ( theChar ) );
  204.             break;
  205.         case updateEvt:
  206.             BeginUpdate ( (WindowPtr) eventPtr->message );
  207.             EndUpdate ( (WindowPtr) eventPtr->message );
  208.             break;
  209.         case diskEvt:
  210.             break;
  211.         case activateEvt:
  212.             break;
  213.         case networkEvt:
  214.             break;
  215.         case driverEvt:
  216.             break;
  217.         case app1Evt:
  218.             break;
  219.         case app2Evt:
  220.             break;
  221.         case app3Evt:
  222.             break;
  223.         case osEvt:
  224.             if ( (eventPtr->message & suspendResumeMessage) == resumeFlag )
  225.                 break;
  226.             break;
  227.         default:
  228.             break;
  229.     }
  230.  
  231. }
  232.  
  233. #pragma mark -
  234.  
  235.  
  236.  
  237.  
  238. /**************   HandleMouseDown function   **************/
  239. void HandleMouseDown ( EventRecord *eventPtr, short itemHit )
  240. {
  241.     WindowPtr        whichWindow;
  242.     GrafPtr            oldPort;
  243.     long             menuChoice;
  244.     short            thePart;
  245.     ControlHandle     control;
  246.     short            trigger = false;
  247.     MenuHandle        menu;
  248.     short            result;
  249.     
  250.     thePart = FindWindow ( eventPtr -> where, &whichWindow );
  251.     
  252.     switch ( thePart )
  253.     {    
  254.         case inMenuBar:
  255.             menuChoice = MenuSelect ( eventPtr->where );
  256.             HandleMenuChoice ( menuChoice );
  257.             break;
  258.         case inSysWindow:
  259.             SystemClick ( eventPtr, whichWindow );
  260.             break;
  261.     }
  262. }
  263.  
  264.  
  265.  
  266.  
  267.  
  268. /**************   HandleMenuChoice function   **************/
  269. void HandleMenuChoice ( long menuChoice )
  270. {
  271.     short    menu;
  272.     short     item;
  273.     
  274.     if ( menuChoice != 0 )
  275.     {
  276.         menu = HiWord ( menuChoice );
  277.         item = LoWord ( menuChoice );
  278.         
  279.         switch ( menu )
  280.         {
  281.             case 128:
  282.                 HandleAppleChoice ( item );
  283.                 break;
  284.             case 129:
  285.                 HandleFileChoice ( item );
  286.                 break;
  287.         }
  288.         
  289.         HiliteMenu ( 0 );
  290.     }
  291. }
  292.  
  293. /**************   HandleAppleChoice function   **************/
  294. void HandleAppleChoice ( short item )
  295. {
  296.     MenuHandle  appleMenu;
  297.     Str255         accName;
  298.     short        accNumber;
  299.     
  300.     switch ( item )
  301.     {
  302.         case 1:
  303.             DrawAboutDialog ();
  304.             break;
  305.         default:
  306.             appleMenu = GetMHandle (128);
  307.             GetItem ( appleMenu, item, accName );
  308.             accNumber = OpenDeskAcc ( accName );
  309.             break;
  310.     }
  311. }
  312.  
  313. /**************   HandleFileChoice function   **************/
  314. void HandleFileChoice ( short item )
  315. {
  316.     WindowPtr        window = nil;
  317.     MenuHandle        menu;
  318.     short            result = 2;
  319.     Str63            untitledWindow = "\puntitled";
  320.         
  321.     window = FrontWindow ();
  322.     
  323.     switch ( item )
  324.     {
  325.         case 1:
  326.             HandleTest1 ();
  327.             break;    
  328.         case 2:
  329.             HandleTest2 ();
  330.             break;                
  331.         case 4:
  332.             gDone = true;
  333.             break;
  334.     }
  335. }
  336.  
  337.  
  338.  
  339. #pragma mark -
  340.  
  341. /**************   DrawAboutDialog function   **************/
  342. void DrawAboutDialog ( void )
  343. {
  344.     DialogRecord    myDialog;
  345.     DialogPtr        dialog;
  346.     Boolean            dialogDone = false;
  347.     short            itemType, item1;
  348.     Rect            itemRect;
  349.     Handle            textItemHandle;
  350.     Handle            textItemHandle2;
  351.     
  352.     dialog = GetNewDialog ( 128, nil, kMoveToFront );
  353.     if ( dialog  )
  354.     {
  355.             
  356.         SetPort ( dialog );
  357.  
  358.         ShowWindow ( dialog );
  359.         
  360.         do 
  361.         {
  362.             ModalDialog ( NULL, &item1 );
  363.             
  364.         }    while ( item1 != 1 );
  365.         
  366.  
  367.         DisposeDialog ( dialog );
  368.     }
  369.  
  370. }
  371.  
  372.  
  373.  
  374. /************************************************************************/
  375. /*    HandleTmCalcParametersChoice function                                */
  376. /*                                                                        */
  377. /*  This copies the value of the input variables into the text edit box */
  378. /*  Author: Jason Giles & Ray Lefebvre                                    */
  379. /*    Created: September 16, 1995                                            */
  380. /*     Modified: April 4, 1996                                                */
  381. /************************************************************************/
  382. void HandleTest1 ()
  383. {
  384.     DialogRecord    myDialog;
  385.     DialogPtr        dialog;
  386.     Boolean            dialogDone = false;
  387.     short            itemHit = 0, itemType = 0;
  388.     Handle            okItemHandle;
  389.     Handle            cancelItemHandle;
  390.     Rect            itemRect;
  391.     Handle            itemHandle;
  392.  
  393.  
  394.     dialog = GetNewDialog ( 130, nil, kMoveToFront );
  395.     SetPort ( dialog );
  396.     
  397.     SetDialogFontAndSize( dialog, geneva, 9 );
  398.     
  399.     SetDialogDefaultItem ( dialog, ok );            // this draws circle around default item
  400.     
  401.     SetDialogTracksCursor ( dialog, true );
  402.     
  403.     GetDItem ( dialog, 3, &itemType, &itemHandle, &itemRect );
  404.     SetCtlValue ( (ControlHandle) itemHandle, 1 );
  405.     
  406.     GetDItem ( dialog, 4, &itemType, &itemHandle, &itemRect );
  407.     SetCtlValue ( (ControlHandle) itemHandle, 0);
  408.     
  409.     GetDItem ( dialog, 5, &itemType, &itemHandle, &itemRect );
  410.     SetCtlValue ( (ControlHandle) itemHandle, 0 );
  411.     
  412.     GetDItem ( dialog, 6, &itemType, &itemHandle, &itemRect );
  413.     SetCtlValue ( (ControlHandle) itemHandle, 0 );
  414.     
  415.     HideDItem ( dialog, 14 );
  416.     HideDItem ( dialog, 15 );
  417.     HideDItem ( dialog, 16 );
  418.     HideDItem ( dialog, 17 );
  419.     HideDItem ( dialog, 18 );
  420.     HideDItem ( dialog, 19 );
  421.     HideDItem ( dialog, 20 );
  422.     HideDItem ( dialog, 21 );
  423.     HideDItem ( dialog, 22 );
  424.     HideDItem ( dialog, 23 );
  425.     HideDItem ( dialog, 2 );
  426.     ShowDItem ( dialog, 8 );
  427.     ShowDItem ( dialog, 9 );
  428.     ShowDItem ( dialog, 10 );
  429.     ShowDItem ( dialog, 11 );
  430.     ShowDItem ( dialog, 12 );
  431.     ShowDItem ( dialog, 13 );
  432.     
  433.     ShowWindow ( dialog );
  434.  
  435.     while ( !dialogDone )
  436.     {
  437.         ModalDialog ( nil, &itemHit );
  438.         
  439.         switch ( itemHit )
  440.         {
  441.             case ( 3 ):
  442.                 GetDItem ( dialog, 3, &itemType, &itemHandle, &itemRect );
  443.                 SetCtlValue ( (ControlHandle) itemHandle, 1 );
  444.                 GetDItem ( dialog, 4, &itemType, &itemHandle, &itemRect );
  445.                 SetCtlValue ( (ControlHandle) itemHandle, 0 );
  446.                 GetDItem ( dialog, 5, &itemType, &itemHandle, &itemRect );
  447.                 SetCtlValue ( (ControlHandle) itemHandle, 0 );
  448.                 GetDItem ( dialog, 6, &itemType, &itemHandle, &itemRect );
  449.                 SetCtlValue ( (ControlHandle) itemHandle, 0 );
  450.                 HideDItem ( dialog, 14 );
  451.                 HideDItem ( dialog, 15 );
  452.                 HideDItem ( dialog, 16 );
  453.                 HideDItem ( dialog, 17 );
  454.                 HideDItem ( dialog, 18 );
  455.                 HideDItem ( dialog, 19 );
  456.                 HideDItem ( dialog, 20 );
  457.                 HideDItem ( dialog, 21 );
  458.                 HideDItem ( dialog, 22 );
  459.                 HideDItem ( dialog, 23 );
  460.                 HideDItem ( dialog, 2 );
  461.                 ShowDItem ( dialog, 8 );
  462.                 ShowDItem ( dialog, 9 );
  463.                 ShowDItem ( dialog, 10 );
  464.                 ShowDItem ( dialog, 11 );
  465.                 ShowDItem ( dialog, 12 );
  466.                 ShowDItem ( dialog, 13 );
  467.                 break;
  468.             case ( 4 ):
  469.                 GetDItem ( dialog, 3, &itemType, &itemHandle, &itemRect );
  470.                 SetCtlValue ( (ControlHandle) itemHandle, 0 );
  471.                 GetDItem ( dialog, 4, &itemType, &itemHandle, &itemRect );
  472.                 SetCtlValue ( (ControlHandle) itemHandle, 1 );
  473.                 GetDItem ( dialog, 5, &itemType, &itemHandle, &itemRect );
  474.                 SetCtlValue ( (ControlHandle) itemHandle, 0 );
  475.                 GetDItem ( dialog, 6, &itemType, &itemHandle, &itemRect );
  476.                 SetCtlValue ( (ControlHandle) itemHandle, 0 );
  477.                 HideDItem ( dialog, 8 );
  478.                 HideDItem ( dialog, 9 );
  479.                 HideDItem ( dialog, 10 );
  480.                 HideDItem ( dialog, 11 );
  481.                 HideDItem ( dialog, 12 );
  482.                 HideDItem ( dialog, 13 );
  483.                 HideDItem ( dialog, 20 );
  484.                 HideDItem ( dialog, 21 );
  485.                 HideDItem ( dialog, 22 );
  486.                 HideDItem ( dialog, 23 );
  487.                 HideDItem ( dialog, 2 );
  488.                 ShowDItem ( dialog, 14 );
  489.                 ShowDItem ( dialog, 15 );
  490.                 ShowDItem ( dialog, 16 );
  491.                 ShowDItem ( dialog, 17 );
  492.                 ShowDItem ( dialog, 18 );
  493.                 ShowDItem ( dialog, 19 );
  494.                 break;
  495.             case ( 5 ):
  496.                 GetDItem ( dialog, 3, &itemType, &itemHandle, &itemRect );
  497.                 SetCtlValue ( (ControlHandle) itemHandle, 0 );
  498.                 GetDItem ( dialog, 4, &itemType, &itemHandle, &itemRect );
  499.                 SetCtlValue ( (ControlHandle) itemHandle, 0 );
  500.                 GetDItem ( dialog, 5, &itemType, &itemHandle, &itemRect );
  501.                 SetCtlValue ( (ControlHandle) itemHandle, 1 );
  502.                 GetDItem ( dialog, 6, &itemType, &itemHandle, &itemRect );
  503.                 SetCtlValue ( (ControlHandle) itemHandle, 0 );
  504.                 HideDItem ( dialog, 14 );
  505.                 HideDItem ( dialog, 15 );
  506.                 HideDItem ( dialog, 16 );
  507.                 HideDItem ( dialog, 17 );
  508.                 HideDItem ( dialog, 18 );
  509.                 HideDItem ( dialog, 19 );
  510.                 HideDItem ( dialog, 23 );
  511.                 HideDItem ( dialog, 2 );
  512.                 HideDItem ( dialog, 8 );
  513.                 HideDItem ( dialog, 9 );
  514.                 HideDItem ( dialog, 10 );
  515.                 HideDItem ( dialog, 11 );
  516.                 HideDItem ( dialog, 12 );
  517.                 HideDItem ( dialog, 13 );
  518.                 ShowDItem ( dialog, 20 );
  519.                 ShowDItem ( dialog, 21 );
  520.                 ShowDItem ( dialog, 22 );
  521.                 break;
  522.             case ( 6 ):
  523.                 GetDItem ( dialog, 3, &itemType, &itemHandle, &itemRect );
  524.                 SetCtlValue ( (ControlHandle) itemHandle, 0 );
  525.                 GetDItem ( dialog, 4, &itemType, &itemHandle, &itemRect );
  526.                 SetCtlValue ( (ControlHandle) itemHandle, 0 );
  527.                 GetDItem ( dialog, 5, &itemType, &itemHandle, &itemRect );
  528.                 SetCtlValue ( (ControlHandle) itemHandle, 0 );
  529.                 GetDItem ( dialog, 6, &itemType, &itemHandle, &itemRect );
  530.                 SetCtlValue ( (ControlHandle) itemHandle, 1 );
  531.                 HideDItem ( dialog, 8 );
  532.                 HideDItem ( dialog, 9 );
  533.                 HideDItem ( dialog, 10 );
  534.                 HideDItem ( dialog, 11 );
  535.                 HideDItem ( dialog, 12 );
  536.                 HideDItem ( dialog, 13 );
  537.                 HideDItem ( dialog, 14 );
  538.                 HideDItem ( dialog, 15 );
  539.                 HideDItem ( dialog, 16 );
  540.                 HideDItem ( dialog, 17 );
  541.                 HideDItem ( dialog, 18 );
  542.                 HideDItem ( dialog, 19 );
  543.                 HideDItem ( dialog, 20 );
  544.                 HideDItem ( dialog, 21 );
  545.                 HideDItem ( dialog, 22 );
  546.                 ShowDItem ( dialog, 23 );
  547.                 ShowDItem ( dialog, 2 );
  548.                 break;
  549.             case ok:
  550.                 dialogDone = true;
  551.                 break;
  552.         }
  553.     }
  554.  
  555.     DisposeDialog ( dialog );
  556.     
  557. }
  558.  
  559. /************************************************************************/
  560. /*    HandleTmCalcParametersChoice function                                */
  561. /*                                                                        */
  562. /*  This copies the value of the input variables into the text edit box */
  563. /*  Author: Jason Giles & Ray Lefebvre                                    */
  564. /*    Created: September 16, 1995                                            */
  565. /*     Modified: April 4, 1996                                                */
  566. /************************************************************************/
  567. void HandleTest2 ( void )
  568. {
  569.     DialogRecord    myDialog;
  570.     DialogPtr        dialog;
  571.     Boolean            dialogDone = false;
  572.     short            itemHit = 0, itemType = 0;
  573.     Handle            okItemHandle;
  574.     Handle            cancelItemHandle;
  575.     Rect            itemRect;
  576.     Handle            itemHandle;
  577.  
  578.  
  579.     dialog = GetNewDialog ( 129, nil, kMoveToFront );
  580.     SetPort ( dialog );
  581.         
  582.     SetDialogDefaultItem ( dialog, ok );            // this draws circle around default item
  583.     
  584.     SetDialogTracksCursor ( dialog, true );
  585.     
  586.     ShowWindow ( dialog );
  587.  
  588.     while ( !dialogDone )
  589.     {
  590.         ModalDialog ( nil, &itemHit );
  591.         
  592.         switch ( itemHit )
  593.         {
  594.             case ok:
  595.                 dialogDone = true;
  596.                 break;
  597.         }
  598.     }
  599.  
  600.     DisposeDialog ( dialog );
  601.     
  602. }
  603. /***************************************************************************************************
  604.     GetDialogItemHandle
  605.     by Bob Bradley
  606. ***************************************************************************************************/
  607.  
  608. void    GetDialogItemHandle( DialogRef dialog, short item, Handle *iHandle )
  609. {
  610.     short        iType;
  611.     Rect        iRect;
  612.     
  613.     GetDialogItem( dialog, item, &iType, iHandle, &iRect );
  614. }
  615.  
  616.  
  617. /************ SetDialogFontAndSize Function ************/
  618. void    SetDialogFontAndSize( DialogRef dialog, short font, short fontSize )
  619. {
  620.     FontInfo    fInfo;
  621.  
  622.     TextFont( font );
  623.     TextSize( fontSize );
  624.     GetFontInfo( &fInfo );
  625.     
  626.     ( **( ( ( DialogPeek ) dialog )->textH ) ).txFont = font;
  627.     ( **( ( ( DialogPeek ) dialog )->textH ) ).txSize = fontSize;
  628.     ( **( ( ( DialogPeek ) dialog )->textH ) ).lineHeight = fInfo.ascent + fInfo.descent + 
  629.                                                             fInfo.leading;
  630.     ( **( ( ( DialogPeek ) dialog )->textH ) ).fontAscent = fInfo.ascent;
  631. }
  632.  
  633.